const vscode = require('vscode');
const fs = require('fs-extra');
const path = require('path');
const configManager = require('./configManager');

/**
 * 将选中的代码添加到模板库
 * @returns {Promise<boolean>} 是否成功添加
 */
async function addSelectionToTemplate() {
    try {
        // 获取当前活动编辑器
        const editor = vscode.window.activeTextEditor;
        if (!editor) {
            vscode.window.showErrorMessage('没有打开的编辑器');
            return false;
        }

        // 获取选中的文本
        const selection = editor.selection;
        if (selection.isEmpty) {
            vscode.window.showErrorMessage('没有选中任何代码');
            return false;
        }

        const selectedText = editor.document.getText(selection);

        // 获取模板库列表
        const repositories = await configManager.getRepositories();
        if (!repositories || repositories.length === 0) {
            vscode.window.showErrorMessage('没有配置模板库，请先在设置中配置模板库');
            return false;
        }

        // 选择模板库
        const repositoryNames = repositories.map(repo => repo.name);
        const selectedRepositoryName = await vscode.window.showQuickPick(repositoryNames, {
            placeHolder: '选择目标模板库'
        });

        if (!selectedRepositoryName) {
            return false; // 用户取消选择
        }

        const selectedRepository = repositories.find(repo => repo.name === selectedRepositoryName);
        
        // 确定模板库路径
        let templatePath;
        if (selectedRepository.type === 'local') {
            templatePath = selectedRepository.path;
        } else { // git类型
            templatePath = path.join(selectedRepository.localPath, selectedRepository.path || '');
        }

        // 确保目录存在
        await fs.ensureDir(templatePath);
        
        // 获取模板库中已有的文件和文件夹名称
        let existingItems = [];
        try {
            const items = await fs.readdir(templatePath);
            existingItems = items.map(item => {
                const isDir = fs.statSync(path.join(templatePath, item)).isDirectory();
                return {
                    label: item,
                    description: isDir ? '文件夹' : '文件'
                };
            }).filter(item => item.description === '文件');
        } catch (error) {
            console.error('读取模板库内容失败:', error);
            // 即使读取失败，也继续后续流程
        }

        // 获取模板文件名
        let fileName = null;
        let filePath = null;
        let retry = true;
        
        while (retry) {
            // 先使用QuickPick显示现有文件列表作为建议
            const quickPickItems = [
                { label: '新建文件', description: '新建文件' },
                ...existingItems
            ];
            
            const selectedItem = await vscode.window.showQuickPick(quickPickItems, {
                placeHolder: '选择覆盖已有文件或输入新建文件',
                ignoreFocusOut: true
            });
            
            if (!selectedItem) {
                return false; // 用户取消选择
            }
            if (selectedItem.label === '新建文件') {
                fileName = await vscode.window.showInputBox({
                    prompt: '输入新建文件名',
                    validateInput: (value) => {
                        if (!value || value.trim().length === 0) {
                            return '文件名不能为空';
                        }
                        return null;
                    },
                    ignoreFocusOut: true
                });
            } else {
                fileName = selectedItem.label;
                filePath = path.join(templatePath, fileName);
            }
            
            if (!fileName) {
                return false; // 用户取消输入
            }
            
            filePath = path.join(templatePath, fileName);
            
            // 检查目标路径是否已存在
            if (await fs.pathExists(filePath)) {
                const isDirectory = (await fs.stat(filePath)).isDirectory();
                const itemType = isDirectory ? '文件夹' : '文件';
                
                const overwrite = await vscode.window.showQuickPick(
                    ['是', '否'],
                    {
                        placeHolder: `模板库中已存在名为 "${fileName}" 的${itemType}，是否覆盖？`,
                        ignoreFocusOut: true
                    }
                );
                
                if (overwrite === '是') {
                    // 删除现有文件或文件夹
                    await fs.remove(filePath);
                    retry = false; // 结束循环
                } else if (overwrite === '否') {
                    // 用户选择不覆盖，继续循环让用户重新输入文件名
                    continue;
                } else {
                    // 用户取消操作
                    vscode.window.showInformationMessage('已取消添加模板操作');
                    return false;
                }
            } else {
                // 文件不存在，可以直接写入
                retry = false;
            }
        }

        // 写入文件
        await fs.writeFile(filePath, selectedText, 'utf8');

        vscode.window.showInformationMessage(`已成功将选中代码添加到模板库 ${selectedRepositoryName} 中的 ${fileName} 文件`);
        return true;
    } catch (error) {
        vscode.window.showErrorMessage(`添加选中代码到模板库失败: ${error.message}`);
        console.error('添加选中代码到模板库失败:', error);
        return false;
    }
}

module.exports = {
    addSelectionToTemplate
};